package com.example.demo.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Component
public class TokenUtil {
    private static String secretKey = "DB12";

    /**
     * 加密token.
     */
    public static String getToken(String userId, String userRole, long time) {
        //这个是放到负载payLoad 里面,魔法值可以使用常量类进行封装.
        String token = JWT
                .create() // 创建一个新的JWT构建器实例
                .withClaim("userId", userId) // 向JWT的负载（payload）中添加一个名为"userId"的声明，并设置其值为变量userId的值
                .withClaim("userRole", userRole) // 向JWT的负载中添加一个名为"userRole"的声明，并设置其值为变量userRole的值
                .withClaim("time", time) // 向JWT的负载中添加一个名为"timeStamp"的声明，并设置其值为变量time的值
                .sign(Algorithm.HMAC256(secretKey)); // 使用HMAC256算法和提供的密钥（secretKey）对JWT进行签名，生成最终的令牌字符串
        return token; // 返回生成的JWT令牌字符串
    }

    /**
     * 解析token
     */
    public static Map<String, String> parseToken(String token) {
        // 创建一个新的HashMap，用于存储解码后的JWT中的特定声明
        HashMap<String, String> map = new HashMap<String, String>();
        // 使用指定的密钥(secretKey)和HMAC256算法来验证JWT
        // 如果验证成功，则返回解码后的JWT对象；如果验证失败，则抛出异常
        DecodedJWT decodedjwt = JWT.require(Algorithm.HMAC256(secretKey)).build().verify(token);
        // 从解码后的JWT中获取名为"userId"的声明
        Claim userId = decodedjwt.getClaim("userId");
        // 从解码后的JWT中获取名为"userRole"的声明
        Claim userRole = decodedjwt.getClaim("userRole");
        // 从解码后的JWT中获取名为"time"的声明
        Claim time = decodedjwt.getClaim("time");
        // 将"userId"声明的值转换为字符串，并存入map中，键为"userId"
        map.put("userId", userId.asString());
        // 将"userRole"声明的值转换为字符串，并存入map中，键为"userRole"
        map.put("userRole", userRole.asString());
        // 将"time"声明的值转换为长整型字符串，并存入map中，键为"time"
        map.put("time", time.asLong().toString());
        return map;// 返回包含解码信息的map
    }
}
